home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / HTML / Javascript / Convert.php
PHP Script  |  2004-03-24  |  12KB  |  369 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 3.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/3_0.txt.                                  |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Tal Peer <tal@php.net>                                      |
  17. // |          Pierre-Alain Joye <paj@pearfr.org>                          |
  18. // +----------------------------------------------------------------------+
  19. // $Id: Convert.php,v 1.10 2003/05/06 00:20:03 pajoye Exp $
  20. /**
  21.  * A class for converting PHP variables into JavaScript variables
  22.  *
  23.  * Usage example:
  24.  * <code>
  25.  * $js = new HTML_Javascript_Convert()
  26.  * $a = array('foo','bar','buz',1,2,3);
  27.  * $b = $js->convertVar($a, 'arr', true);
  28.  * </code>
  29.  * or
  30.  * <code>
  31.  * echo HTML_Javascript_Convert::convertArray($a);
  32.  * </code>
  33.  *
  34.  * @author Tal Peer <tal@php.net>
  35.  * @author Pierre-Alain Joye <paj@pearfr.org>
  36.  * @package HTML_Javascript
  37.  * @subpackage Convert
  38.  * @version 1.1.1
  39.  * @licence http://www.php.net/license/3_0.txt PHP Licence 3.0
  40.  * @access public
  41.  * @example examples/js.php How to use Convert
  42.  */
  43.  
  44. /**
  45.  * Invalid variable error
  46.  */
  47. define('HTML_JAVASCRIPT_CONVERT_ERROR_INVVAR', 502, true);
  48.  
  49. if(!defined('HTML_JAVASCRIPT_NL')){
  50.     /** Linefeed to use, default set to Unix linefeed.
  51.      * Define it before the include/require if you want to
  52.      * override it.
  53.      */
  54.     define('HTML_JAVASCRIPT_NL',"\n");
  55. }
  56.  
  57. /** requires PEAR_Error */
  58. require_once('PEAR.php');
  59.  
  60. /**
  61.  * PHP to Javascript conversion classes
  62.  *
  63.  * It converts Variable or value to Javascript.
  64.  *
  65.  * @package HTML_Javascript
  66.  * @subpackage Convert
  67.  */
  68. class HTML_Javascript_Convert
  69. {
  70.     // {{{ HTML_Javscript_Convert
  71.  
  72.     /**
  73.      * Constructor - creates a new HTML_Javascript_Convert object
  74.      *
  75.      */
  76.     function HTML_Javscript_Convert()
  77.     {
  78.     }
  79.  
  80.     // }}} HTML_Javscript_Convert
  81.     // {{{ escapeString
  82.  
  83.     /**
  84.      * Used to terminate escape characters in strings,
  85.      * as javascript doesn't allow them
  86.      *
  87.      * @param   string  the string to be processed
  88.      * @return  mixed   the processed string
  89.      *
  90.      * @access public
  91.      * @source
  92.      */
  93.     function escapeString($str)
  94.     {
  95.         $js_escape = array(
  96.             "\r"    => '\r',
  97.             "\n"    => '\n',
  98.             "\t"    => '\t',
  99.             "'"     => "\\'",
  100.             '"'     => '\"',
  101.             '\\' => '\\\\'
  102.         );
  103.  
  104.         return strtr($str,$js_escape);
  105.     }
  106.  
  107.     // }}} escapeString
  108.     // {{{ convertVar
  109.  
  110.     /**
  111.      * Converts  a PHP variable into a JS variable
  112.      * you can safely provide strings, arrays
  113.      * or booleans as arguments for this function
  114.      *
  115.      * @access public
  116.      * @param  mixed   $var     the variable to convert
  117.      * @param  string  $varname the variable name to declare
  118.      * @param  boolean $global  if true, the JS var will be global
  119.      * @return mixed   a PEAR_Error if no script was started
  120.      *                 or the converted variable
  121.      */
  122.     function convertVar($var, $varname, $global = false)
  123.     {
  124.         $var_type    = gettype($var);
  125.         switch ( $var_type ) {
  126.             case 'boolean':
  127.                 return HTML_Javascript_Convert::convertBoolean(
  128.                             $var, $varname, $global
  129.                         );
  130.                 break;
  131.             case 'integer':
  132.             case 'double':
  133.                 $ret = '';
  134.                 if ($global) {
  135.                     $ret = 'var ';
  136.                 }
  137.                 $ret .= $varname.' = '.$var;
  138.                 return $ret.';'.HTML_JAVASCRIPT_NL;
  139.                 break;
  140.             case 'string':
  141.                 return HTML_Javascript_Convert::convertString(
  142.                             $var, $varname, $global
  143.                         );
  144.                 break;
  145.             case 'array':
  146.                 return HTML_Javascript_Convert::convertArray(
  147.                             $var, $varname, $global
  148.                         );
  149.                 break;
  150.             default:
  151.                 return HTML_Javascript_Convert::raiseError(
  152.                         HTML_JAVASCRIPT_ERROR_INVVAR
  153.                     );
  154.                 break;
  155.         }
  156.     }
  157.  
  158.     // }}} convertVar
  159.     // {{{ raiseError
  160.  
  161.     /**
  162.      * A custom error handler
  163.      *
  164.      * @access public
  165.      * @param  integer $code the error code
  166.      * @return mixed   false if the error code is invalid,
  167.      *                 or a PEAR_Error otherwise
  168.      */
  169.     function raiseError($code)
  170.     {
  171.         $ret = null;
  172.         switch ($code) {
  173.             case HTML_JAVASCRIPT_ERROR_INVVAR:
  174.                 $ret = HTML_Javascript::raiseError(
  175.                         'Invalid variable', HTML_JAVASCRIPT_ERROR_INVVAR
  176.                         );
  177.                 break;
  178.             default:
  179.                 $ret = HTML_Javascript::raiseError(
  180.                     'Unknown Error', HTML_JAVASCRIPT_ERROR_INVVAR
  181.                     );
  182.                 break;
  183.         }
  184.         return $ret;
  185.     }
  186.  
  187.     // }}} raiseError
  188.     // {{{ convertString
  189.  
  190.     /**
  191.      * Converts  a PHP string into a JS string
  192.      *
  193.      * @access public
  194.      * @param  string  $str     the string to convert
  195.      * @param  string  $varname the variable name to declare
  196.      * @param  boolean $global  if true, the JS var will be global
  197.      * @return mixed   a PEAR_Error if no script was started
  198.      *                 or the converted string
  199.      */
  200.     function convertString($str, $varname, $global = false)
  201.     {
  202.         $var = '';
  203.         if($global) {
  204.             $var = 'var ';
  205.         }
  206.         $str = HTML_Javascript_Convert::escapeString($str);
  207.         $var .= $varname.' = "'.$str.'"';
  208.         return $var.';'.HTML_JAVASCRIPT_NL;;
  209.     }
  210.  
  211.     // }}} convertString
  212.     // {{{ convertBoolean
  213.  
  214.     /**
  215.      * Converts a PHP boolean variable into a JS boolean variable.
  216.      * Note this function does not check the type of $book, only if
  217.      * the expression $bool is true or false.
  218.      *
  219.      * @access public
  220.      * @param  boolean $bool    the boolean variable
  221.      * @param  string  $varname the variable name to declare
  222.      * @param  boolean $global  set to true to make the JS variable global
  223.      * @return mixed   a PEAR_Error on error or a string  with the declaration
  224.      */
  225.     function convertBoolean($bool, $varname, $global = false)
  226.     {
  227.         $var = '';
  228.         if($global) {
  229.             $var = 'var ';
  230.         }
  231.         $var    .= $varname.' = ';
  232.         $var    .= $bool?'true':'false';
  233.         return $var.';'.HTML_JAVASCRIPT_NL;
  234.     }
  235.  
  236.     // }}} convertBoolean
  237.     // {{{ convertArray
  238.  
  239.     /**
  240.      * Converts  a PHP array into a JS array
  241.      * supports of multu-dimensional array.
  242.      * Keeps keys as they are (associative arrays).
  243.      *
  244.      * @access public
  245.      * @param  string  $arr     the array to convert
  246.      * @param  string  $varname the variable name to declare
  247.      * @param  boolean $global  if true, the JS var will be global
  248.      * @param  int     $level   Not public, used for recursive calls
  249.      * @return mixed   a PEAR_Error if no script was started
  250.      *                 or the converted array
  251.      */
  252.     function convertArray($arr, $varname, $global = false, $level=0)
  253.     {
  254.         $var = '';
  255.         if ($global) {
  256.             $var = 'var ';
  257.         }
  258.         if ( is_array($arr) ){
  259.             $length = sizeof($arr);
  260.             $var    .= $varname . ' = Array('. $length .')'.HTML_JAVASCRIPT_NL;
  261.             foreach ( $arr as $key=>$cell ){
  262.                 $jskey  = '"' . $key . '"';
  263.                 if ( is_array( $cell ) ){
  264.                     $level++;
  265.                     $var    .= HTML_Javascript_Convert::convertArray(
  266.                                     $cell,'tmp'.$level,$global,$level
  267.                                 );
  268.                     $var    .= $varname .
  269.                                 "[$jskey] = tmp$level".
  270.                                 HTML_JAVASCRIPT_NL;
  271.                     $var    .= "tmp$level = null".HTML_JAVASCRIPT_NL;
  272.                 } else {
  273.                     $value  = is_string($cell)?
  274.                                 '"' .
  275.                                 HTML_Javascript_Convert::escapeString($cell) .
  276.                                 '"'
  277.                                 :$cell;
  278.                     $var    .= $varname . "[$jskey] = $value".
  279.                                 HTML_JAVASCRIPT_NL;
  280.                 }
  281.             }
  282.             return $var;
  283.         } else {
  284.             return HTML_Javascript::raiseError(
  285.                         HTML_JAVASCRIPT_ERROR_INVVAR
  286.                     );
  287.         }
  288.     }
  289.  
  290.     // }}} convertArray
  291.     // {{{ convertArrayToProperties
  292.  
  293.     /**
  294.      * Converts a PHP array into a JS object
  295.      * supports of multu-dimensional array.
  296.      * Keeps keys as they are (associative arrays).
  297.      *
  298.      * @access public
  299.      * @param  string  $arr     the array to convert
  300.      * @param  string  $varname the variable name to declare
  301.      * @param  boolean $new     if true, the JS var will be set
  302.      * @return mixed   a PEAR_Error or the converted array
  303.      */
  304.     function convertArrayToProperties(
  305.         $array, $varname, $global=false, $new=true
  306.     )
  307.     {
  308.         if(is_array($array)){
  309.             $cnt = sizeof($array)-1;
  310.             $i  = 0;
  311.             $convert = $global?'var ':'';
  312.             $convert .= $new?$varname.'={'.HTML_JAVASCRIPT_NL:'{';
  313.             foreach( $array as $key=>$val) {
  314.                 $key = $key?'"'.$key.'"':"'0'";
  315.                 $convert .= $key.':';
  316.                 if(is_array($val)){
  317.                     $convert .= HTML_Javascript_Convert::convertArrayToProperties($val,'',false, false);
  318.                     $convert .= $i++<$cnt?','.HTML_JAVASCRIPT_NL:'';
  319.                 } else {
  320.                     $convert .= HTML_Javascript_Convert::convertValue($val);
  321.                     $convert .= $i++<$cnt?',':'';
  322.                 }
  323.             }
  324.             $convert .= HTML_JAVASCRIPT_NL.'}';
  325.         }
  326.         if($new){
  327.             $convert .= ';';
  328.         }
  329.         return $convert;
  330.     }
  331.  
  332.     // }}} convertArrayToProperties
  333.     // {{{convertValue
  334.  
  335.     /**
  336.      * Converts a variable value to its javascript equivalent.
  337.      * String variables are escaped (see {@link escapeString()}).
  338.      *
  339.      * @param  string  $param coment
  340.      * @access public
  341.      * @return mixed return
  342.      */
  343.     function convertValue( $val )
  344.     {
  345.         switch ( gettype($val) ) {
  346.             case 'boolean':
  347.                 return $val?'true':'false';
  348.             case 'integer':
  349.             case 'double':
  350.                 return $val;
  351.             case 'string':
  352.                 return "'".HTML_Javascript_Convert::escapeString($val)."'";
  353.             case 'array':
  354.                 return HTML_Javascript_Convert::convertArray(
  355.                             $val, $varname, $global
  356.                         );
  357.                 break;
  358.             default:
  359.                 return HTML_Javascript_Convert::raiseError(
  360.                         HTML_JAVASCRIPT_ERROR_INVVAR
  361.                     );
  362.                 break;
  363.         }
  364.     }
  365.  
  366.     // }}} convertValue
  367.  
  368. }
  369.